function Star(uname, age) {
  this.uname = uname
  this.age = age
    // this.sing = function() {
    //   console.log(this.uname + 'singing');
    // }
}

Star.prototype.sing = function() { //公共方法放在原型对象上
  console.log(this.uname + 'singing'); //这样就不会新开辟内存空间了
}

let ldh = new Star('刘德华', 18)
let zxy = new Star('张学友', 20)
  // 构造函数虽然好但是存在浪费内存的问题
console.log(ldh.sing === zxy.sing); //   复杂数据类型 另开内存 （用不同的内存存放相同的东西，浪费！！！）

ldh.sing()
zxy.sing()
  //构造函数原型prototype
  //JS规定每个构造函数都有一个prototype属性，执行另一个对象。这个prototype就是一个对象，这个对象的搜游属性和方法都会被构造函数所拥有

console.dir(Star);
//我们可以把那些不变的方法直接定义在prototype上，这样所有的对象的实例就可以共享这些方法